/*
* This is part of Geomajas, a GIS framework, http://www.geomajas.org/.
*
* Copyright 2008-2015 Geosparc nv, http://www.geosparc.com/, Belgium.
*
* The program is available in open source according to the GNU Affero
* General Public License. All contributions in this program are covered
* by the Geomajas Contributors License Agreement. For full licensing
* details, see LICENSE.txt in the project root.
*/
package org.geomajas.quickstart.gwt2.client.widget.layer;
import com.google.gwt.core.client.GWT;
import com.google.gwt.dom.client.Style;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.event.dom.client.MouseOutEvent;
import com.google.gwt.event.dom.client.MouseOutHandler;
import com.google.gwt.event.dom.client.MouseOverEvent;
import com.google.gwt.event.dom.client.MouseOverHandler;
import com.google.gwt.event.logical.shared.ResizeEvent;
import com.google.gwt.event.logical.shared.ResizeHandler;
import com.google.gwt.uibinder.client.UiBinder;
import com.google.gwt.uibinder.client.UiField;
import com.google.gwt.user.client.Timer;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.CheckBox;
import com.google.gwt.user.client.ui.HTMLPanel;
import com.google.gwt.user.client.ui.HasVerticalAlignment;
import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.Image;
import com.google.gwt.user.client.ui.InlineLabel;
import com.google.gwt.user.client.ui.IsWidget;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.PopupPanel;
import com.google.gwt.user.client.ui.Widget;
import org.geomajas.configuration.NamedStyleInfo;
import org.geomajas.gwt2.client.GeomajasServerExtension;
import org.geomajas.gwt2.client.map.MapPresenter;
import org.geomajas.gwt2.client.map.layer.Layer;
import org.geomajas.gwt2.client.map.layer.LayersModel;
import org.geomajas.gwt2.client.map.layer.RasterServerLayerImpl;
import org.geomajas.gwt2.client.map.layer.VectorServerLayerImpl;
import org.geomajas.sld.FeatureTypeStyleInfo;
import org.geomajas.sld.RuleInfo;
import org.geomajas.quickstart.gwt2.client.ApplicationService;
import org.geomajas.quickstart.gwt2.client.i18n.ApplicationMessages;
import org.geomajas.quickstart.gwt2.client.resource.ApplicationResource;
import org.geomajas.quickstart.gwt2.client.util.UrlBuilder;
/**
* The layer legend panel widget.
*
* @author David Debuck
*
*/
public class LayerLegend implements IsWidget {
@UiField
protected PopupPanel layerLegendPanel;
private MapPresenter mapPresenter;
private Button closeLayerPopupPanelButton = new Button();
private ApplicationMessages msg = GWT.create(ApplicationMessages.class);
private static final LayerLegendUiBinder UIBINDER = GWT.create(LayerLegendUiBinder.class);
/**
* UI binder interface.
*
* @author David Debuck
*
*/
interface LayerLegendUiBinder extends UiBinder<Widget, LayerLegend> {
}
/**
* Default constructor.
*/
public LayerLegend() {
UIBINDER.createAndBindUi(this);
ApplicationResource.INSTANCE.css().ensureInjected();
this.mapPresenter = ApplicationService.getInstance().getMapPresenter();
layerLegendPanel.addDomHandler(new MouseOverHandler() {
@Override
public void onMouseOver(MouseOverEvent event) {
ApplicationService.getInstance().setTooltipShowingAllowed(false);
}
}, MouseOverEvent.getType());
layerLegendPanel.addDomHandler(new MouseOutHandler() {
@Override
public void onMouseOut(MouseOutEvent event) {
ApplicationService.getInstance().setTooltipShowingAllowed(true);
}
}, MouseOutEvent.getType());
Window.addResizeHandler(new BrowserResizedHandler());
initLayerLegend();
}
/**
* Handler that listens when the browser gets resized.
* This will calculate and rescale the search filter accordingly, we are using a timer here as this will unload the
* browser somewhat when handling the events.
*
* @author David Debuck
*/
class BrowserResizedHandler implements ResizeHandler {
private Timer resizeTimer = new Timer() {
@Override
public void run() {
ApplicationService.getInstance().getLayerLegend().hide();
}
};
@Override
public void onResize(ResizeEvent event) {
resizeTimer.cancel();
resizeTimer.schedule(100);
}
}
/**
* Add the content tp the popup panel.
* @param wrapper HTMLPanel
*/
public void add(HTMLPanel wrapper) {
layerLegendPanel.add(wrapper);
}
/**
* Set the popup position.
*
* @param left int
* @param top int
*/
public void setPopupPosition(int left, int top) {
layerLegendPanel.setPopupPosition(left, top);
}
/**
* Hide the layerLegendPanel.
*/
public void hide() {
layerLegendPanel.hide();
}
/**
* Hide the layerLegendPanel.
*/
public void show() {
layerLegendPanel.setModal(false);
layerLegendPanel.setWidth("200px");
layerLegendPanel.show();
}
@Override
public Widget asWidget() {
return layerLegendPanel;
}
/**
* Get a fully build layer legend for a LayersModel.
*
* @param layerPopupPanelContent Original HTMLPanel
* @param layersModel LayersModel of the map
* @return HTMLPanel fully build legend.
*/
private HTMLPanel getLayersLegend(HTMLPanel layerPopupPanelContent, LayersModel layersModel) {
for (int i = 0; i < mapPresenter.getLayersModel().getLayerCount(); i++) {
HTMLPanel layer = new HTMLPanel("");
CheckBox visible = new CheckBox();
final int finalI = i;
visible.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
if (mapPresenter.getLayersModel().getLayer(finalI).isMarkedAsVisible()) {
mapPresenter.getLayersModel().getLayer(finalI).setMarkedAsVisible(false);
} else {
mapPresenter.getLayersModel().getLayer(finalI).setMarkedAsVisible(true);
}
}
});
if (mapPresenter.getLayersModel().getLayer(i).isMarkedAsVisible()) {
visible.setValue(true);
}
InlineLabel layerName = new InlineLabel(
mapPresenter.getLayersModel().getLayer(i).getTitle()
);
layer.add(visible);
layer.add(layerName);
layerPopupPanelContent.add(layer);
////////////////////////////////
// Add legend items
////////////////////////////////
Layer legendLayer = mapPresenter.getLayersModel().getLayer(i);
if (legendLayer instanceof VectorServerLayerImpl) {
VectorServerLayerImpl serverLayer = (VectorServerLayerImpl) legendLayer;
String legendUrl = GeomajasServerExtension.getInstance().getEndPointService().getLegendServiceUrl();
NamedStyleInfo styleInfo = serverLayer.getLayerInfo().getNamedStyleInfo();
String name = serverLayer.getLayerInfo().getNamedStyleInfo().getName();
int x = 0;
for (FeatureTypeStyleInfo sfi : styleInfo.getUserStyle().getFeatureTypeStyleList()) {
for (RuleInfo rInfo : sfi.getRuleList()) {
UrlBuilder url = new UrlBuilder(legendUrl);
url.addPath(serverLayer.getServerLayerId());
url.addPath(name);
url.addPath(x + ".png");
x++;
HorizontalPanel layout = new HorizontalPanel();
layout.setVerticalAlignment(HasVerticalAlignment.ALIGN_MIDDLE);
layout.add(new Image(url.toString()));
Label labelUi = new Label(rInfo.getName());
labelUi.getElement().getStyle().setMarginLeft(5, Style.Unit.PX);
layout.add(labelUi);
layout.getElement().getStyle().setMarginLeft(20, Style.Unit.PX);
layout.getElement().getStyle().setMarginTop(3, Style.Unit.PX);
layerPopupPanelContent.add(layout);
}
}
} else if (legendLayer instanceof RasterServerLayerImpl) {
RasterServerLayerImpl serverLayer = (RasterServerLayerImpl) legendLayer;
String legendUrl = GeomajasServerExtension.getInstance().getEndPointService().getLegendServiceUrl();
UrlBuilder url = new UrlBuilder(legendUrl);
url.addPath(serverLayer.getServerLayerId() + ".png");
HorizontalPanel layout = new HorizontalPanel();
layout.setVerticalAlignment(HasVerticalAlignment.ALIGN_MIDDLE);
layout.add(new Image(url.toString()));
Label labelUi = new Label("");
labelUi.getElement().getStyle().setMarginLeft(5, Style.Unit.PX);
layout.add(labelUi);
layout.getElement().getStyle().setMarginLeft(20, Style.Unit.PX);
layout.getElement().getStyle().setMarginTop(3, Style.Unit.PX);
layerPopupPanelContent.add(layout);
}
}
return layerPopupPanelContent;
}
/**
* Init the layer legend panel.
*/
private void initLayerLegend() {
HTMLPanel layerPopupPanelWrapper = new HTMLPanel("");
closeLayerPopupPanelButton.addStyleName(ApplicationResource.INSTANCE.css().closePopupPanelButton());
closeLayerPopupPanelButton.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
layerLegendPanel.hide();
ApplicationService.getInstance().setTooltipShowingAllowed(true);
}
});
HTMLPanel closeLayerButtonContainer = new HTMLPanel("");
closeLayerButtonContainer.addStyleName(ApplicationResource.INSTANCE.css().popupPanelHeader());
Label layerTitle = new Label(msg.layerLegendPanelTitle());
closeLayerButtonContainer.add(layerTitle);
closeLayerButtonContainer.add(closeLayerPopupPanelButton);
layerPopupPanelWrapper.add(closeLayerButtonContainer);
HTMLPanel layerPopupPanelContent = new HTMLPanel("");
layerPopupPanelContent.addStyleName(ApplicationResource.INSTANCE.css().layerPopupPanelContent());
// Add a generated layers legend.
layerPopupPanelWrapper.add(
getLayersLegend(layerPopupPanelContent, mapPresenter.getLayersModel())
);
layerLegendPanel.add(layerPopupPanelWrapper);
}
}